﻿using System;
using System.Collections.Generic;
using System.Text;

namespace ch.ethz.ssh2.util
{
    public static class Utility
    {

        /*******************************/
        /// <summary>
        /// Method used to obtain the underlying type of an object to make the correct method call.
        /// </summary>
        /// <param name="tempObject">Object instance received.</param>
        /// <param name="method">Method name to invoke.</param>
        /// <param name="parameters">Object array containing the method parameters.</param>
        /// <returns>The return value of the method called with the proper parameters.</returns>
        public static System.Object InvokeMethodAsVirtual(System.Object tempObject, System.String method, System.Object[] parameters)
        {
            System.Reflection.MethodInfo methodInfo;
            System.Type type = tempObject.GetType();
            if (parameters != null)
            {
                System.Type[] types = new System.Type[parameters.Length];
                for (int index = 0; index < parameters.Length; index++)
                    types[index] = parameters[index].GetType();
                methodInfo = type.GetMethod(method, types);
            }
            else methodInfo = type.GetMethod(method);
            try
            {
                return methodInfo.Invoke(tempObject, parameters);
            }
            catch (System.Exception exception)
            {
                throw exception.InnerException;
            }
        }


        /// <summary>Reads a number of characters from the current source Stream and writes the data to the target array at the specified index.</summary>
        /// <param name="sourceStream">The source Stream to read from.</param>
        /// <param name="target">Contains the array of characteres read from the source Stream.</param>
        /// <param name="start">The starting index of the target array.</param>
        /// <param name="count">The maximum number of characters to read from the source Stream.</param>
        /// <returns>The number of characters read. The number will be less than or equal to count depending on the data available in the source Stream. Returns -1 if the end of the stream is reached.</returns>
        public static System.Int32 ReadInput(System.IO.Stream sourceStream, byte[] target, int start, int count)
        {
            // Returns 0 bytes if not enough space in target
            if (target.Length == 0)
                return 0;

            byte[] receiver = new byte[target.Length];
            int bytesRead = sourceStream.Read(receiver, start, count);

            // Returns -1 if EOF
            if (bytesRead == 0)
                return -1;

            for (int i = start; i < start + bytesRead; i++)
                target[i] = (byte)receiver[i];

            return bytesRead;
        }
    }
}
